/**
 * 棋盘.
 */

var rectW = 30, rectH = 30;     //格子长宽
var continuityNum = 5;          //多少个连成一条线才算赢
var zr;         //画布对象
var pointList = new PointLinkedList();      //记录棋盘结构的链表
var opportunity = true;            //机会（该谁落子）
var fallPieceStack = [];            //落子栈，记录每次下棋的数据
var isOver = false;             //是否此局已经结束
var isDemo = false;             //是否为 demo 环境
var isStep = false;             //是否为显示步骤

var preClick = {                //预点击对象
    'circle' : null,            //预点击图像对象
    'point' : null              //预点击坐标对象
};

$(function () {
    zr = zrender.init(document.getElementById('main'));

    init();
});


function init() {
    //绘制棋盘
    drawCheckerboard();

    aiInit();
    // pointList.console();
}


//棋盘点
function PointItem (){
    this.x = null;      //x轴像素位置
    this.y = null;      //y轴像素位置
    this.piece = null;       //棋子    null 不存在  false 敌人       true自己

    this.xNum = null;   //x轴顺序位置
    this.yNum = null;   //y轴顺序位置
}

//处理点击表格事件
function clickPoint(event) {
    if(isOver) {
        return;         //此局结束
    }

    //没有轮到自己啥都不做
    if(isDemo === false && opportunity === false) {
        return
    }

    var nodeInfo = event.target.extendInfo.nodeInfo;
    //计算定位位置，获取当前点击的格子的右边、下边、右下边，计算点击坐标与哪个坐标最近
    var currNode = pointList.getIndex(nodeInfo.xNum, nodeInfo.yNum);
    var aroundList = [currNode, currNode.next, currNode.down];
    if(currNode.down) {
        aroundList[aroundList.length] = currNode.down.next;
    }

    //确定预点击位置
    var offsetX = rectW, offsetY = rectH;     //设置初始偏移量为格子大小
    for (let idx in aroundList) {
        var item = aroundList[idx].data;
        //当前点击的 x, y 是否里此格子左上角最近
        var isLately = Math.abs(event.offsetX - item.x)  < offsetX || Math.abs(event.offsetY - item.y)  < offsetY;
        if(isLately) {
            nodeInfo = item;
            offsetX = Math.abs(event.offsetX - item.x) ;
            offsetY = Math.abs(event.offsetY - item.y) ;
        }
    }

    //判断此地是否可以落子（可能已存在落子）
    if(nodeInfo.piece != null) {
        return;
    }

    //绘制预点击
    drawBeforehandSelect(nodeInfo);
}

/**
 * 落子.
 * @param nodePoint 落在哪个格子
 */
function fallPiece(nodePoint) {
    var pieceCircle = drawPiece({
        x : nodePoint.x,
        y : nodePoint.y,
        power : opportunity
    });

    zr.add(pieceCircle);

    //记录棋盘落子情况
    fallPieceStack[fallPieceStack.length] = {
        // 'point' : nodePoint,        //落子位置
        // 'opportunity' : opportunity,    //谁落子的
        'node' : pointList.getIndex(nodePoint.xNum, nodePoint.yNum),        //格子对象
        'circle' : pieceCircle      //棋子对象
    }
    nodePoint.piece = opportunity;

    //判断是否赢了
    if(isVictory()) {
        return;
    }

    //切换对方点击落子
    opportunity = !opportunity;

    //如果该电脑，那就调用电脑自动下
    if(isOver === false && isDemo === false && opportunity === false) {
        aiAutoFallPiece();
    }
}

/**
 * 判断是否赢了.
 */
function isVictory() {
    var lastPoint = fallPieceStack[fallPieceStack.length - 1];
    var allPathList = pieceTemplate.templateGetList(lastPoint.node, 5, lastPoint.node.data.piece);

    for (let i = 0; i < allPathList.length; i++) {
        var path = allPathList[i];
        if(path.pathNodeList.length === continuityNum) {
            isOver = true;
            drawVictoryAnimate(path);
            return true;
        }
    }

    return false;
}

